# -*- coding: utf-8 -*-

# @author Anderson R. Livramento
# Copyright (C) 2008 Anderson Rodrigues Livramento <anderdevel@users.sourceforge.net>
#
# O conteúdo deste arquivo está disponível dentro dos termos 
# da Licença Pública Geral GNU como publicada pela 
# Fundação do Software Livre (FSF); na versão 2 da Licença, ou
# (na sua opnião) qualquer versão mais recente.
#
# Este programa é distribuído na esperança que possa ser útil,
# mas SEM NENHUMA GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a
# qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a
# Licença Pública Geral GNU para maiores detalhes.
#
# Você deve ter recebido uma cópia da Licença Pública Geral GNU, sob
# o título "LICENCA.txt", junto com este programa; se não, escreva para
# a Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor,
# Boston, MA  02110-1301  US
#
import formencode
import forms

import votafammodel
import votafam.lib.objectutils as objectutils

from pylons import config

from sqlalchemy import MetaData
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.orm.collections import InstrumentedList

__model_list = {}

#-----{Generic}------------------------------------------
def new_from(table,**kwargs):
    new_columns = {}
    for col in table.c:
        if col.default is not None:
            new_columns[col.name] = col.default.arg
        else:
            new_columns[col.name] = None
        
    if kwargs:
        for key in kwargs:
            if new_columns and new_columns.has_key(key):
                new_columns[key] = kwargs[key]
    return new_columns

def get_model(model_name):
    str_model = model_name + 'Model'
    if __model_list.has_key(str_model):
        return __model_list[str_model]
    return None

def save_or_update(entity_obj,EntityClass,**kwargs):
    stored_obj = None
    if entity_obj and not isinstance(entity_obj,EntityClass):
        stored_obj = EntityClass()
        objectutils.copy_dict(entity_obj,stored_obj)
    else:
        stored_obj = entity_obj
        is_update = True
    Session.save_or_update(stored_obj)
    Session.commit()
    Session.refresh(stored_obj)
    return stored_obj

    
Session = scoped_session(sessionmaker(autoflush=False,transactional=True,bind=config['pylons.g'].sa_engine))
meta = MetaData()

__model_names = [model_name for model_name in dir(votafammodel) if model_name.endswith('Model')]

#
# Data models instances
#
for model_name in __model_names:
    __model_list[model_name] = getattr(votafammodel,model_name)(meta)

#
# Data models mapping
#
for model_name in __model_names:
    if hasattr(__model_list[model_name],'depends_on'):
        dependent_tables = {}
        for depmodel in __model_list[model_name].depends_on.split(';'):
            dependent_tables[depmodel] = get_model(depmodel).table
            
        __model_list[model_name].mapping(Session,**dependent_tables)
    else:
        __model_list[model_name].mapping(Session)

#
# Validation forms mapping
#
__form_validators = [form_class for form_class in dir(forms) if form_class.endswith('Form')]
for form_validator in __form_validators:
    if hasattr(getattr(forms,form_validator),'mapper_class'):
        FormValidator = getattr(forms,form_validator)
        forms.form_mapper(FormValidator,getattr(votafammodel,FormValidator.mapper_class))

#
# Formencode locale settings
#
formencode.api.set_stdtranslation(domain='FormEncode',languages=['pt_BR'])

#
# objectutils List types settings
#
if InstrumentedList not in objectutils.LIST_TYPES:
    objectutils.LIST_TYPES.append(InstrumentedList)
